package cz.cvut.manatee.processManager;

import com.phrasebox.manatee.*;


public class ConcordanceQuery extends ContainsCQLQuery {
	/*
	 * promene maxline a ty, ktere se predavaji strukture KWICLines
	 */
	protected       int 	maxline;		// maximalni pocet radku ktere chci vratit
	protected final String	leftContext; 	// levý kontex ve formátu -NUM[#|:ATTRIBUTE] (viz), -10# = 10 písmen, -3:s = 3 věty
	protected final String	rightContext; 	// pravý kontex ve formátu NUM[#|:ATTRIBUTE] viz levý
	protected final String	kwica; 			// atribut ("lemma", "word", ...) podle toho v jakém formátu chceme vrátit kwic (hledané slovo)
	protected final String	ctxa;			// atribut ("lemma", "word", ...) podle toho v jakém formátu chceme vrátit kontext (hledané slovo)
	protected final String	struca;			// nastavení atributů oddělených čárkami, které chci v kwicu také zobrazit ("s,doc")
	protected final String	refa;			// výpis referencí (id slova, název dokumentu, ...), které chci zobrazit, "#" je pozice, další možné atributy jsou ve /var/lib/manatee/registry/ a udávají se za "=" oddělené čárkou, tedy např. "#,=s.id,=opus.nazev"
	protected final int		maxctx;			// maximální délka kontextu ve slovech
	protected final boolean useview;		// nezjištěno 

	/*
	 * konstruktor bude prijimat korpus a objekt s dotazem
	 */
	public ConcordanceQuery(String corpusName, String CQL, int maxline, String leftContext, String rightContext, String kwica, String ctxa, String struca, String refa, int maxctx, boolean useview){
		super(corpusName, CQL);
		this.maxline  	  = maxline;
		this.leftContext  = leftContext;
		this.rightContext = rightContext;
		this.kwica        = kwica;
		this.ctxa         = ctxa;
		this.struca       = struca;
		this.refa         = refa;
		this.maxctx       = maxctx;
		this.useview      = useview;
	}

	/*
	 * druhy konstuktor
	 */
	public ConcordanceQuery(String corpusName, String CQL, int maxline, String leftContext, String rightContext, String kwica, String ctxa, String struca, String refa, int maxctx){
		this(corpusName, CQL, maxline, leftContext, rightContext, kwica, ctxa, struca, refa, maxctx, true);
	}

	/*
	 * treti konstruktor
	 */
	public ConcordanceQuery(String corpusName, String CQL, int maxline, String leftContext, String rightContext, String kwica, String ctxa, String struca, String refa){
		this(corpusName, CQL, maxline, leftContext, rightContext, kwica, ctxa, struca, refa, 0);
	}
	
	public void execute(ThreadRunnable thread){
		//zavolat zmenu stavu na executing

		Logging.get().info("Query: execute na "+this+" pocitano na "+thread);
		
		Corpus corp = OptimizedCorpus.getInstance(thread, this.corpusName);
		
		Concordance conc = OptimizedConcordance.getInstance(thread, corp, this.CQL);
		
		// priklad KWICLines kl = new KWICLines (conc, 15, "15#", "15#", "word", "word", "s", "#", 100, false);
		KWICLines kl = new KWICLines (conc, this.leftContext, this.rightContext, this.kwica, this.ctxa, this.struca, this.refa, this.maxctx, this.useview);
		
		ConcordanceResult result = new ConcordanceResult();
		
		if (this.maxline > conc.size()) this.maxline = conc.size();
		for (int linenum = 0; linenum < this.maxline; linenum++) {
			if (! kl.nextline (linenum)) break;
			result.addLine();
			addRefs(kl, result);
			makeColumn(kl.get_left(), result);
			makeColumn(kl.get_kwic(), result);
			makeColumn(kl.get_right(), result);
		}
		
		this.result = result;
	}
	

	/*
	 * pomocna metoda pro rozlozeni posloupnosti tokenu
	 * (slov a formatovacich znacek) na jednotliva slova
	 */
    public static void makeColumn(StrVector tokens, ConcordanceResult result) {
		result.addColumn();
		for (int i=0;  i < tokens.size(); i++) {
		    result.addWord(tokens.get(i));
		}
    }

	/*
	 * pomocna metoda pro pridani refeneci do objaktu result
	 * je zde vicemene proto abychom nemuseli myslet na pridani
	 * noveho sloupce pri vkladani referenci
	 */
    public static void addRefs(KWICLines kl, ConcordanceResult result) {
		result.addColumn();
		result.addWord(kl.get_refs());
    }
	
	/*
	 * Vypisuje svuj obsah
	 */
	public String toString() {
		return "ConcordanceQuery("+super.toString()+")";
	}
}
